/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

angular.module('flowableModeler').controller('FlowableFormReferenceDisplayCtrl', [
  '$scope',
  '$modal',
  '$http',
  function($scope, $modal, $http) {
    if ($scope.property && $scope.property.value && $scope.property.value.id) {
      $http.get(FLOWABLE.APP_URL.getModelUrl($scope.property.value.id)).success(function(response) {
        $scope.form = {
          id: response.id,
          name: response.name
        }
      })
    }
  }
])

angular.module('flowableModeler').controller('FlowableFormReferenceCtrl', [
  '$scope',
  '$modal',
  '$http',
  function($scope, $modal, $http) {
    // Config for the modal window
    var opts = {
      template: 'editor-app/configuration/properties/form-reference-popup.html?version=' + Date.now(),
      scope: $scope
    }

    // Open the dialog
    _internalCreateModal(opts, $modal, $scope)
  }
])

angular.module('flowableModeler').controller('FlowableFormReferencePopupCtrl', [
  '$rootScope',
  '$scope',
  '$http',
  '$location',
  'editorManager',
  function($rootScope, $scope, $http, $location, editorManager) {
    $scope.state = { loadingForms: true, formError: false }

    $scope.popup = { state: 'formReference' }

    $scope.foldersBreadCrumbs = []

    // Close button handler
    $scope.close = function() {
      $scope.property.mode = 'read'
      $scope.$hide()
    }

    // Selecting/deselecting a subprocess
    $scope.selectForm = function(form, $event) {
      $event.stopPropagation()
      if ($scope.selectedForm && $scope.selectedForm.id && form.id == $scope.selectedForm.id) {
        // un-select the current selection
        $scope.selectedForm = null
      } else {
        $scope.selectedForm = form
      }
    }

    // Saving the selected value
    $scope.save = function() {
      if ($scope.selectedForm) {
        $scope.property.value = {
          id: $scope.selectedForm.id,
          name: $scope.selectedForm.name,
          key: $scope.selectedForm.key
        }
      } else {
        $scope.property.value = null
      }
      $scope.updatePropertyInModel($scope.property)
      $scope.close()
    }

    // Open the selected value
    $scope.open = function() {
      if ($scope.selectedForm) {
        $scope.property.value = {
          id: $scope.selectedForm.id,
          name: $scope.selectedForm.name,
          key: $scope.selectedForm.key
        }

        $scope.updatePropertyInModel($scope.property)

        var modelMetaData = editorManager.getBaseModelData()
        var json = editorManager.getModel()
        json = JSON.stringify(json)

        var params = {
          modeltype: modelMetaData.model.modelType,
          json_xml: json,
          name: modelMetaData.name,
          key: modelMetaData.key,
          description: modelMetaData.description,
          newversion: false,
          lastUpdated: modelMetaData.lastUpdated
        }

        // Update
        $http({
          method: 'POST',
          data: params,
          ignoreErrors: true,
          headers: { Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
          transformRequest: function(obj) {
            var str = []
            for (var p in obj) {
              str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]))
            }
            return str.join('&')
          },
          url: FLOWABLE.URL.putModel(modelMetaData.modelId)
        })
          .success(function(data, status, headers, config) {
            editorManager.handleEvents({
              type: ORYX.CONFIG.EVENT_SAVED
            })

            var allSteps = EDITOR.UTIL.collectSortedElementsFromPrecedingElements($scope.selectedShape)

            $rootScope.addHistoryItem($scope.selectedShape.resourceId)
            $location.path('form-editor/' + $scope.selectedForm.id)
          })
          .error(function(data, status, headers, config) {})

        $scope.close()
      }
    }

    $scope.newForm = function() {
      $scope.popup.state = 'newForm'

      var modelMetaData = editorManager.getBaseModelData()

      $scope.model = {
        loading: false,
        form: {
          name: '',
          key: '',
          description: '',
          modelType: 2
        }
      }
    }

    $scope.createForm = function() {
      if (
        !$scope.model.form.name ||
        $scope.model.form.name.length == 0 ||
        !$scope.model.form.key ||
        $scope.model.form.key.length == 0
      ) {
        return
      }

      $scope.model.loading = true

      $http({ method: 'POST', url: FLOWABLE.APP_URL.getModelsUrl(), data: $scope.model.form })
        .success(function(data, status, headers, config) {
          var newFormId = data.id
          $scope.property.value = {
            id: newFormId,
            name: data.name,
            key: data.key
          }
          $scope.updatePropertyInModel($scope.property)

          var modelMetaData = editorManager.getBaseModelData()
          var json = editorManager.getModel()
          json = JSON.stringify(json)

          var params = {
            modeltype: modelMetaData.model.modelType,
            json_xml: json,
            name: modelMetaData.name,
            key: modelMetaData.key,
            description: modelMetaData.description,
            newversion: false,
            lastUpdated: modelMetaData.lastUpdated
          }

          // Update
          $http({
            method: 'POST',
            data: params,
            ignoreErrors: true,
            headers: { Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
            transformRequest: function(obj) {
              var str = []
              for (var p in obj) {
                str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]))
              }
              return str.join('&')
            },
            url: FLOWABLE.URL.putModel(modelMetaData.modelId)
          })
            .success(function(data, status, headers, config) {
              editorManager.handleEvents({
                type: ORYX.CONFIG.EVENT_SAVED
              })

              $scope.model.loading = false
              $scope.$hide()

              var allSteps = EDITOR.UTIL.collectSortedElementsFromPrecedingElements($scope.selectedShape)

              $rootScope.addHistoryItem($scope.selectedShape.resourceId)
              $location.path('form-editor/' + newFormId)
            })
            .error(function(data, status, headers, config) {
              $scope.model.loading = false
              $scope.$hide()
            })
        })
        .error(function(data, status, headers, config) {
          $scope.model.loading = false
          $scope.model.errorMessage = data.message
        })
    }

    $scope.cancel = function() {
      $scope.close()
    }

    $scope.loadForms = function() {
      var modelMetaData = editorManager.getBaseModelData()
      $http
        .get(FLOWABLE.APP_URL.getFormModelsUrl())
        .success(function(response) {
          $scope.state.loadingForms = false
          $scope.state.formError = false
          $scope.forms = response.data
        })
        .error(function(data, status, headers, config) {
          $scope.state.loadingForms = false
          $scope.state.formError = true
        })
    }

    if ($scope.property && $scope.property.value && $scope.property.value.id) {
      $scope.selectedForm = $scope.property.value
    }

    $scope.loadForms()
  }
])
